
import flash.events.Event;
package bola
{
	// ========================================================================
	import com.HitTest;
	
	import flash.display.DisplayObject;
	import flash.display.DisplayObjectContainer;
	import flash.display.Sprite;
	import flash.geom.Point;
	
	import kapi.API;
	import kapi.mvc.Graficable;
	// ========================================================================

	public class Vista implements Graficable
	{
		// ====================================================================
		private var _bola:Bola
		private var _grafico:Sprite
		// ====================================================================

		// ====================================================================
		// CONSTRUCTOR
		// ====================================================================

		// --------------------------------------------------------------------
		public function Vista(bola:Bola)
		{
			_bola = bola
			crearVista()
			escucharEventosDelModelo()
		}

		// ====================================================================
		// PROPERTIES
		// ====================================================================

		// --------------------------------------------------------------------
		public function get grafico():DisplayObject { return _grafico }

		// ====================================================================
		// FUNCIONES
		// ====================================================================

		// --------------------------------------------------------------------
		private function crearVista():void
		{
			_grafico = new API.recursos['mcBola']()
		}
		// --------------------------------------------------------------------
		public function mostrarEn(contenedor:DisplayObjectContainer):void
		{
			contenedor.addChild(_grafico)
		}
		// --------------------------------------------------------------------
		private function escucharEventosDelModelo():void
		{
			_bola.alPosicionar.escuchar(posicionar)
			_bola.antesDeActualizar.escuchar(verificarColisiones)
			_bola.despuesDeActualizar.escuchar(mover)
		}
		// --------------------------------------------------------------------
		private function posicionar(posicion:Point):void
		{
			_grafico.x = posicion.x
			_grafico.y = posicion.y
		}
		// --------------------------------------------------------------------
		private function verificarColisiones(posicion:Point):void
		{
			var posicionOriginal:Point = new Point(_grafico.x, _grafico.y)

			posicionar(new Point(posicion.x, _grafico.y))
			if (HitTest.ComplexHitTestObject(_bola.mundo.grafico, _grafico))
				_bola.dejarDeDesplazarHorizontalmente()

			posicionar(new Point(_grafico.x, posicion.y))
			if (HitTest.ComplexHitTestObject(_bola.mundo.grafico, _grafico))
				_bola.dejarDeDesplazarVerticalmente()

			posicionar(posicionOriginal)
		}
		// --------------------------------------------------------------------
		private function mover():void
		{
			/*
			var deltaX:Number = _bola.posicion.x - _grafico.x
			var signo:int = (deltaX > 0 ? 1 : (deltaX < 0 ? -1 : 0))
			_grafico.rotation += signo
			posicionar(_bola.posicion)
*/
			_grafico.rotation += (_bola.posicion.x - _grafico.x) * 2
			posicionar(_bola.posicion)
		}

		/*
		// --------------------------------------------------------------------
		private function actualizar():void
		{
			intentarCaerUnPoco()
			actor.posicionar(new Point(grafico.x, grafico.y))
		}
		

		// --------------------------------------------------------------------
		private function intentarMoverALaIzquierda():void
		{
			var xOriginal:Number = grafico.x
			var yOriginal:Number = grafico.y

			intentarIrALaIzquierda()
			if (grafico.x == xOriginal)
				intentarSubirUnPoco(intentarIrALaIzquierda)				

			var x:Number = grafico.x
			var y:Number = grafico.y
			grafico.x = xOriginal
			grafico.y = yOriginal
			var nuevaPosicion:Point = new Point(x, y)
			actor.posicionar(nuevaPosicion)

			if (grafico.parent.localToGlobal(nuevaPosicion).x <= API.stage.stageWidth / 2 && actor.mundo.x <= 0)
				actor.mundo.x += 1
		}
		// --------------------------------------------------------------------
		private function intentarIrALaIzquierda():void
		{
			var xOriginal:Number = grafico.x
			var yOriginal:Number = grafico.y

			intentarIrALaIzquierda()
			if (grafico.x == xOriginal)
				intentarSubirUnPoco(intentarIrALaIzquierda)				

			var x:Number = grafico.x
			var y:Number = grafico.y
			grafico.x = xOriginal
			grafico.y = yOriginal
			var nuevaPosicion:Point = new Point(x, y)
			actor.posicionar(nuevaPosicion)

			if (grafico.parent.localToGlobal(nuevaPosicion).x <= API.stage.stageWidth / 2 && actor.mundo.x <= 0)
				actor.mundo.x += 1
			grafico.x -= 1
			if (HitTest.ComplexHitTestObject(actor.mundo.grafico, grafico))
				grafico.x += 1
		}

		// --------------------------------------------------------------------
		private function intentarMoverALaDerecha():void
		{
			var xOriginal:Number = grafico.x
			var yOriginal:Number = grafico.y

			intentarIrALaDerecha()
			if (grafico.x == xOriginal)
				intentarSubirUnPoco(intentarIrALaDerecha)

			var x:Number = grafico.x
			var y:Number = grafico.y
			grafico.x = xOriginal
			grafico.y = yOriginal
			var nuevaPosicion:Point = new Point(x, y)
			actor.posicionar(nuevaPosicion)

			if (grafico.parent.localToGlobal(nuevaPosicion).x >= API.stage.stageWidth / 2 && actor.mundo.x + actor.mundo.grafico.width > API.stage.stageWidth)
				actor.mundo.x -= 1
		}
		// --------------------------------------------------------------------
		private function intentarIrALaDerecha():void
		{
			grafico.x += 1
			if (HitTest.ComplexHitTestObject(actor.mundo.grafico, grafico))
				grafico.x -= 1
		}

		// --------------------------------------------------------------------
		private function intentarSubirUnPoco(f:Function):void
		{
			var pendienteMaxima:uint = 10
			var pendiente:uint = 0
			do
			{
				grafico.y -= 1
				pendiente++
				f()
			} while (HitTest.ComplexHitTestObject(actor.mundo.grafico, grafico) && pendiente < pendienteMaxima)
		}
		// --------------------------------------------------------------------
		private function intentarCaerUnPoco():void
		{
			grafico.y += 1
			if (HitTest.ComplexHitTestObject(actor.mundo.grafico, grafico))
				grafico.y -= 1
		}
		
		// --------------------------------------------------------------------
		private function intentarSaltar(callback:Function):void
		{
			callback()
		}
		
		// --------------------------------------------------------------------
		private function mover():void
		{
			grafico.rotation += (actor.posicion.x - grafico.x) * 2
			posicionar(actor.posicion)
		}
		// --------------------------------------------------------------------
		private function posicionar(posicion:Point):void
		{
			grafico.x = posicion.x
			grafico.y = posicion.y
		}
		*/
	}
}